package top.lixunda.ecommerce.server.user.api.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import top.lixunda.ecommerce.server.user.api.entity.db.AccountDO;
import top.lixunda.ecommerce.server.user.api.entity.db.AccountBindingDO;
import top.lixunda.ecommerce.server.user.api.entity.db.UserDetailDO;
import top.lixunda.commerce.common.core.entity.MessageObject;
import top.lixunda.ecommerce.server.user.api.entity.dto.*;
import top.lixunda.common.validate.XumValid;

/**
 * @author Xumda
 * @version time:2019/11/19 14:31
 * <p>
 * 用户相关，包括登陆，注册，获取用户信息等基本操作
 */
@SuppressWarnings("unused")
@Api("用户相关，包括登陆，注册，获取用户信息等基本操作")
@RequestMapping("/user")
public interface IUserController {

    /**
     * 使用账户和密码进行普通登录
     *
     * @param loginPassDTO 密码登陆DTO
     * @return 返回去除密码账户信息，登陆失败时返回Object为Null
     */
    @ApiOperation("使用账户和密码进行普通登录")
    @PostMapping("/login")
    MessageObject<UserDetailDO> loginByPass(@RequestBody @XumValid LoginPassDTO loginPassDTO);

    /**
     * 使用token进行登录
     *
     * @param loginTokenDTO 通过token登陆DTO
     * @return 返回去除密码账户信息，登陆失败时返回Object为Null
     */
    @ApiOperation("使用token进行登录")
    @PostMapping("/loginByToken")
    MessageObject<UserDetailDO> loginByToken(@RequestBody @XumValid LoginTokenDTO loginTokenDTO);

    /**
     * 使用验证码进行登录
     *
     * @param loginCodeDTO 验证码登陆DTO
     * @return 返回去除密码账户信息，登陆失败时返回Object为Null
     */
    @ApiOperation("使用验证码进行登录")
    @PostMapping("/loginByCode")
    MessageObject<UserDetailDO> loginByCode(@RequestBody @XumValid LoginCodeDTO loginCodeDTO);

    /**
     * 用户下线，当用户点击下线按钮后执行的操作，将会清除session信息，使token过期
     *
     * @return boolean值，始终为true，表示是否下线成功
     */
    @ApiOperation("用户下线，当用户点击下线按钮后执行的操作，将会清除session信息，使token过期")
    @PostMapping("/logout")
    MessageObject<Boolean> logout();

    /**
     * 发送注册验证码
     *
     * @param sendAuthCodeDTO 包含请求验证码需要的信息
     * @return Boolean
     */
    @ApiOperation("发送注册验证码")
    @PostMapping("sendRegisterCode")
    MessageObject<Boolean> sendRegisterCode(@RequestBody @XumValid SendAuthCodeDTO sendAuthCodeDTO);

    /**
     * 发送登陆验证码
     *
     * @param sendAuthCodeDTO 包含请求验证码需要的信息
     * @return Boolean
     */
    @ApiOperation("发送登陆验证码")
    @PostMapping("sendLoginCode")
    MessageObject<Boolean> sendLoginCode(@RequestBody @XumValid SendAuthCodeDTO sendAuthCodeDTO);

    /**
     * 发送账号绑定验证码
     *
     * @param sendAuthCodeDTO 包含请求验证码需要的信息
     * @return Boolean
     */
    @ApiOperation("发送账号绑定验证码")
    @PostMapping("sendBindingCode")
    MessageObject<Boolean> sendBindingCode(@RequestBody @XumValid SendAuthCodeDTO sendAuthCodeDTO);

    /**
     * 发送解除绑定验证码
     *
     * @param sendAuthCodeDTO 包含请求验证码需要的信息
     * @return Boolean
     */
    @ApiOperation("发送解除绑定验证码")
    @PostMapping("sendUnbindCode")
    MessageObject<Boolean> sendUnbindCode(@RequestBody @XumValid SendAuthCodeDTO sendAuthCodeDTO);

    /**
     * 发送更改密码验证码
     *
     * @param sendAuthCodeDTO 包含请求验证码需要的信息
     * @return Boolean
     */
    @ApiOperation("发送更改密码验证码")
    @PostMapping("sendChangePassCode")
    MessageObject<Boolean> sendChangePassCode(@RequestBody @XumValid SendAuthCodeDTO sendAuthCodeDTO);

    /**
     * 用户通过验证码注册，这里只包括手机号码注册已经邮箱注册
     *
     * @param registerCodeDTO 验证码注册，邮箱注册和手机注册
     * @return 返回注册的账号信息，主要是系统分配的id
     */
    @ApiOperation("用户通过验证码注册，这里只包括手机号码注册已经邮箱注册")
    @PostMapping("/register")
    MessageObject<AccountDO> registerByCode(@RequestBody @XumValid RegisterCodeDTO registerCodeDTO);

    /**
     * 通过验证码绑定当前登陆账户，用户绑定手机已经邮箱
     *
     * @param bindAcctCodeDTO 通过验证码绑定账户DTO
     * @return 绑定是否成功
     */
    @ApiOperation("通过验证码绑定当前登陆账户，用户绑定手机已经邮箱")
    @PostMapping("/binding")
    MessageObject<AccountBindingDO> bindingByCode(@RequestBody @XumValid BindCodeDTO bindAcctCodeDTO);

    /**
     * 根据密码解绑账户
     *
     * @param unbindPasswordDTO 密码解绑DTO
     * @return 是否解绑成功
     */
    @ApiOperation("根据密码解绑账户")
    @PostMapping("/unbindByPass")
    MessageObject<Boolean> unbindByPass(@RequestBody @XumValid UnbindPasswordDTO unbindPasswordDTO);

    /**
     * 根据验证码解绑账户
     *
     * @param unbindCodeDTO 验证码解绑账户DTO
     * @return 是否解绑成功
     */
    @ApiOperation("根据验证码解绑账户")
    @PostMapping("/unbindByCode")
    MessageObject<Boolean> unbindByCode(@RequestBody @XumValid UnbindCodeDTO unbindCodeDTO);

    /**
     * 根据原密码修改密码
     *
     * @param changePassPassDTO 原密码修改密码DTO
     * @return 是否修改成功
     */
    @ApiOperation("根据原密码修改密码")
    @PostMapping("/changePassByPass")
    MessageObject<Boolean> changePassByPass(@RequestBody @XumValid ChangePassPassDTO changePassPassDTO);

    /**
     * 根据验证码修改密码
     *
     * @param changePassCodeDTO 验证码修改密码DTO
     * @return 是否修改成功
     */
    @ApiOperation("根据验证码修改密码")
    @PostMapping("/changePassByCode")
    MessageObject<Boolean> changePassByCode(@RequestBody @XumValid ChangePassCodeDTO changePassCodeDTO);

    /**
     * 获取图片验证码
     *
     * @param key 保存图片的缓存key
     */
    @ApiOperation("获取图片验证码")
    @GetMapping("/imageCode")
    void imageCode(@RequestParam("key") String key);

}
